package com.fit.utils.se;

import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 获取配置文件的工具类
 * 由于多个线程会同时操作Map所以只能是用ConcurrentHashMap,效率低,如果需要频繁调用,建议不要是用此工具类。
 * @author Administrator
 *
 */
public class PropertiesUtil {
	
	private static Logger log = LoggerFactory.getLogger(PropertiesUtil.class);
	
	/**
	 * 配置文件对象 集合
	 */
	private final static Map<String,Properties> PROPERTIES_MAP = new ConcurrentHashMap<String, Properties>();
	
	/**
	 * 获取配置文件的方法
	 * 传入配置文件路径
	 * 返回配置文件对象
	 * @param proPath
	 * @param realTimeMonitoring 是否实时读取配置文件
	 * @return
	 */
	public static Properties getPro(String proPath,boolean realTimeMonitoring){
		if(proPath == null || "".equals(proPath)){
			return null;
		}
		String suffix = ".properties";
		if(proPath.endsWith(suffix)){
			proPath = proPath.substring(0, proPath.length() - suffix.length());
		}
		proPath = proPath.replaceAll("\\.", "/");
		if(!proPath.startsWith("/")){
			proPath = "/"+proPath;
		}
		proPath += suffix;
		Properties proper = null;
		if(!realTimeMonitoring){
			if((proper = PROPERTIES_MAP.get(proPath)) == null){
				proper = createProperties(proPath);
				PROPERTIES_MAP.put(proPath, proper);
			}
		}else{
			proper = createProperties(proPath);
		}
		return proper;
	}
	
	/**
	 * 根据文件路径获取properties文件对象
	 * @param proPath
	 * @return
	 */
	private static Properties createProperties(String proPath){
		Properties proper = null;
		InputStream in = null;
		try{
			proper = new Properties();
			in = PropertiesUtil.class.getResourceAsStream(proPath);
			proper.load(in);
		}catch(Exception e){
			log.error("根据文件路径获取properties文件对象异常", e);
			proper = null;
		}finally{
			IOUtil.close(in);
		}
		return proper;
	}
	
	
	
	/**
	 * 获取配置文件的方法,不实时获取
	 * 传入配置文件路径
	 * 返回配置文件对象
	 * @param proPath
	 * @return
	 */
	public static Properties getPro(String proPath){
		return PropertiesUtil.getPro(proPath, false);
	}
	
	
	
	/**
	 * 根据文件路径和key获取到此文件中的val
	 * @param proPath
	 * @param key
	 * @param realTimeMonitoring 是否实时读取
	 * @return
	 */
	public static String getVal(String proPath,String key,boolean realTimeMonitoring){
		Properties pro = PropertiesUtil.getPro(proPath,realTimeMonitoring);
		return pro.getProperty(key);
	}
	
	/**
	 * 根据文件路径和key获取到此文件中的val,不实时读取
	 * @param proPath
	 * @param key
	 * @return
	 */
	public static String getVal(String proPath,String key){
		return getVal(proPath, key, false);
	}
	
	
	/**
	 * 清空集合中的所有元素
	 */
	public static void clean(){
		PROPERTIES_MAP.clear();
	}
	
	/**
	 * 清空集合中的某个元素
	 */
	public static void clean(String proPath){
		if(proPath == null || "".equals(proPath)){
			return;
		}
		proPath = proPath.replace(".properties", "");
		proPath = proPath.replaceAll("\\.", "/");
		if(!proPath.startsWith("/")){
			proPath = "/"+proPath;
		}
		proPath += ".properties";
		PROPERTIES_MAP.remove(proPath);
	}
	
}




